package com.huwei.modules.base.constant;

import java.util.HashMap;
import java.util.Map;

import com.huwei.modules.base.util.BeanUtil;
import lombok.Data;

/**
 * json 格式请求结果定义
 */
@Data
public class JsonResultConstant {
	/*
	 * 固定字段
	 * 描述：请求结果提示消息
	 * 类型：String
	 */
	private String message;
	/**
	 * 固定字段
	 * 描述：表示请求结果的指示编码，该编码将定义请求执行状态与状态说明，具体可参考《请求结果指示编码》
	 * 类型：Integer
	 * 约定：
	 * 1.  编码起始从100开始
	 * 2.  编码间距为100 ，即：100个数字间隔为一个大的结果分类；
	 * 3  规定200为成功分类、300为重定向分类、400为客户端错误分类、500为服务器错误分类，与http错误协议相同；其他错误自定义；
	 */
	private Integer code;
	/**
	 *固定字段
	 *描述：code编码解释信息，该信息由定义的code约束文件中获取
	 *作用：该字段作用，防止约束文件丢失后，可通过该字段了解到code的含义；
	 */
	private String explain;
	/**
	 * 可变字段
	 * 描述：封装该次请求特有的返回结果；
	 * 类型：json对象的字符串
	 */
	private String data;
	
	/**
	 * 	约束
	 */
	static private Map<String ,String> constantMap = new HashMap<String, String>();
	
	/**
	 * 	单例避免每次创建类示例，浪费资源
	 */
	final static private JsonResultConstant SINGLETON = new JsonResultConstant(null ,null , null, null);
	
	private JsonResultConstant(Integer code ,String explain ,String message, String data) {
		init(code, explain, message, data);
	}
	
	private JsonResultConstant() {}
	
	private void init(Integer code, String explain, String message, String data) {
		this.code = code;
		this.explain = explain;
		this.message = message;
		this.data = data;
	}
	
	static public JsonResultConstant success() {
		return success(null);
	}
	
	static public JsonResultConstant success(String message) {
		return success(message, null);
	}

	static public JsonResultConstant success(String message ,Object obj) {
		return create(200, message, obj);
	}
	
	static public JsonResultConstant create(Integer code) {
		return create(code ,null);
	}
	
	static public JsonResultConstant create(Integer code ,String message) {
		return create(code ,message ,null);
	}
	
	static public JsonResultConstant create(Integer code ,String message ,Object obj) {
		SINGLETON.init(code, constant(code),message, BeanUtil.toJson(obj));
		return SINGLETON;
	}
	
	/**
	 * json非法或为空，则该方法将返回null值
	 * @param json
	 * @return
	 */
	static public JsonResultConstant toBean(String json) {
		return BeanUtil.toBean(json, JsonResultConstant.class);
	}
	
	/**
	 * 	检查json是否非法，即不符合规则定义；
	 * @param json
	 * @return
	 */
	static public boolean isIllegality(String json) {
		return toBean(json) == null;
	}
	
	/**
	 * 	给定json字符串是否成功
	 * @param json
	 * @return
	 */
	static public boolean isSuccessful(String json) {
		JsonResultConstant result = toBean(json);
		return result != null && result.isSuccessful();
	}
	
	/**
	 * 	判断是否成功
	 * @return
	 */
	public boolean isSuccessful() {
		if(this.code == null) {
			return false;
		}
		Integer n = this.code ;
		do {
			n = n / 100;
		}while(n>100);
		return n == 2;
	}
	
	/**
	 * 	初始化json格式编码规则信息
	 * @param constant
	 */
	static public void initialzeJsonResultConstant(Map<String ,String> constant) {
		constantMap = constant;
	}
	
	/**
	 * 	获取code编码对应的规则信息
	 * @param code
	 * @return
	 */
	static public String constant(Integer code) {
		return constant(String.valueOf(code));
	}
	/**
	 * 	获取code编码对应的规则信息
	 * @param code
	 * @return
	 */
	static public String constant(String code) {
		return constantMap.get(code);
	}
}
